package com.gollum.jpa.dao;


import com.gollum.jpa.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;

import javax.persistence.LockModeType;
import java.io.Serializable;
import java.util.List;

/**
 * jpadao 持久层封装接口
 *
 * @author Herther
 * @version 1.0.0
 * @ClassName JpaDao.java
 * @createTime 2022年08月06日 22:21:00
 */
@NoRepositoryBean
public interface JpaDao<T, ID extends Serializable> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {



    /**
     * 分页查询
     * @param page 分页对象
     * @param spec 查询参数
     * @return 分页数据
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/21 21:52
     */
    Page<T> findAllWithPage(Page<T> page,Specification<T> spec);

    /**
     * 分页查询
     * @param page 分页对象
     * @return 分页数据
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/8/21 21:52
     */
    Page<T> findAllWithPage(Page<T> page);

    /**
     * 功能描述: 根据ID查询，加锁查询
     *
     * @param id
     * @param lockModeType
     * @return:
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/7/16 22:00
     */
    T findById(ID id, LockModeType lockModeType);


    /**
     * 功能描述: 批量保存
     *
     * @param entities 实体类迭代器
     * @return: 返回保存的实体
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/7/20 22:41
     */
    List<T> saveInBatch(Iterable<T> entities);

    /**
     * 功能描述: 批量保存 限制数量
     *
     * @param entities 实体类迭代器
     * @param size 数量
     * @return: 返回保存的实体
     * @auther: Herther
     * @version 1.0.0
     * @date: 2022/7/20 22:41
     */
    List<T> saveInBatch(Iterable<T> entities, int size);

    /**
     * 判断是否为新的对象
     * @param entity 判断的实体
     * @return 是否是新的实体
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 21:31
     */
    boolean isNew(T entity);

    /**
     * 功能描述: 逻辑删除根据ID
     *
     * @param id
     * @return 是否删除
     * @auther: Herther
     * @since 1.0.0
     * @date: 2022/9/14 21:44
     */
    boolean logic(ID id);



    //
    ///**
    // * 功能描述: 分页查询返回自定义封装的分页对象
    // *
    // * @param params 查询的map参数
    // * @param page 分页对象
    // * @return
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/13 23:18
    // */
    //Page<T> findAllWithPage(Page<T> page ,Map<String,Object> params);
    //
    //Page<T> findAllWithPage(Page<T> page ,String filter);
    //
    //Page<T> findAllWithPage(Page<T> page);


    ///**
    // * 功能描述: 分页查询
    // * ！！！ 排序规则以 page 里的sort为优先
    // * @param page 分页参数
    // * @superQueryCustom 查询参数
    // * @return params 查询参数
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 20:06
    // */
    //Page<T> findAllWithPage(Page<T> page, SuperQueryCustom superQueryCustom);


    ///**
    // * 功能描述: 根据查询条件查询全部集合
    // * @param: superQueryParams 查询条件
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/7/18 21:42
    // */
    //List<T> findAll(List<SuperQueryParams> superQueryParams);

    ///**
    // * 功能描述:根据查询条件查询全部集合
    // *
    // * @param superQueryParams 查询的条件
    // * @param match 查询条件规则 如果传空则为AND
    // * @return
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/20 22:59
    // */
    //List<T> findAll(List<SuperQueryParams> superQueryParams, Predicate.BooleanOperator match);


    ///**
    // * 根据查询条件查询全部集合
    // *
    // * @param superQueryCustom 动态查询条件
    // * @return
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/20 23:16
    // */
    //List<T> findAll(SuperQueryCustom superQueryCustom, Map<String,String> sorts);
    //
    //
    ///**
    // * 功能描述: 查找单个如果有则返回 没有则返回null
    // *
    // * @param id 根据ID主键查找
    // * @return 领域对象
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/7 18:06
    // */
    //T findOneById(ID id);
    //
    //
    ///**
    // * 功能描述: 根据查询条件查询单个对象
    // *
    // * @param:
    // * @return:
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/7/20 21:57
    // */
    //T findOne(List<SuperQueryParams> superQueryParams);
    //
    //

    //
    //

    //

    //

    //
    ///**
    // * 功能描述: 批量逻辑删除
    // *
    // * @param ids 主键
    // * @return
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/9 23:06
    // */
    //void removeAllById(Iterable<ID> ids);
    //
    ///**
    // * 功能描述: 逻辑删除数据
    // *
    // * @param entities 实体集合
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/9 23:22
    // */
    //void removeAll(Iterable<T> entities);
    //
    ///**
    // * 功能描述: 批量删除 传入实体
    // *
    // * @param entity 实体
    // * @auther: Herther
    // * @version 1.0.0
    // * @date: 2022/8/9 23:24
    // */
    //void remove(T entity);
}
